接下來要講的BCNF是3NF的加強版,
其實對於大部分狀況來說, 做到3NF已足夠,
BCNF是為了解決3NF可能出現的某些問題而被提出,因此條件比3NF更加嚴苛。
目的 : 去除因功能相依產生的異常
消除資料表中的非主鍵屬性對非超鍵屬性的部分依賴性,從而確保資料庫結構的正規化程度更高。
經過3NF後,若資料表的主鍵是由多個欄位組成的,則需要再執行BCNF。
資料表中的每個非主鍵屬性都必須完全依賴於超鍵(Super Key)。
一個超鍵是可以唯一識別資料表中的每個記錄的一個或多個欄位的組合。
如果任何非主鍵欄位依賴於非超鍵屬性,那麼資料表就不符合BCNF。
以顧客保養品購買紀錄為例
假設我們有一個保養品零售商,每位顧客每次購買時都會選擇特定的店員協助。店員每天只負責某個特定的時段。
一開始的資料長這樣:
關聯:購買紀錄
屬性:{顧客ID, 保養品名稱, 購買日期, 店員名稱, 負責時段}
功能依賴有:
{顧客ID, 保養品名稱, 購買日期} → {店員名稱}
{店員名稱, 購買日期} → {負責時段}
因為{顧客ID, 保養品名稱, 購買日期} 和 {店員名稱, 購買日期} 都是超鍵,可以唯一確定購買紀錄。
但是,如果考慮到業務邏輯,一位店員在同一天不可能同時負責多個時段。
因此,{店員名稱, 購買日期} → {負責時段} 的功能依賴違反了BCNF,因為{店員名稱, 購買日期}的「店員名稱」不是超鍵。
為了使關聯符合BCNF,我們可以分解它為以下兩個子關聯:
顧客購買:
屬性:{顧客ID, 保養品名稱, 購買日期, 店員名稱}
店員工作時段:
屬性:{店員名稱, 購買日期, 負責時段}
即可滿足BCNF的要求。
先到這邊,明天見!